package util

import (
	"context"
	"fmt"
	"net/url"
	"runtime"
	"team.wphr.vip/technology-group/infrastructure/trace"
	"time"

	"jinse/idl/exterr"
)

// 内部错误码和外部错误码的分隔，内部错误码使用 10000000 ~ MAX_INT，外部错误码使用 0 ~ 9999999
const minInternalErr = 10000000

var debugFlag = "[DEBUG]"

// DEBUG 调试
func DEBUG(i ...interface{}) {
	now := time.Now().Format("2006-01-02 15:04:05")
	_, file, line, _ := runtime.Caller(1)
	fmt.Printf("\n%s %s [BEGIN] @%s:%d \n", now, debugFlag, file, line)
	fmt.Printf("%s %s [DATA]:%+v ", now, debugFlag, i)
	fmt.Printf("\n%s %s [END]   @%s:%d \n", now, debugFlag, file, line)
}

func GetErrno(err error) int64 {
	if err == nil {
		return exterr.E_ErrOk
	}

	errno := exterr.E_DEFAULT_ERROR

	type coder interface {
		Code() int64
	}

	if code, ok := err.(coder); ok {
		errno = code.Code()
	}

	return errno
}

func GenOuterErrno(err error) int64 {
	if err == nil {
		return exterr.E_ErrOk
	}

	errno := exterr.E_DEFAULT_ERROR

	type coder interface {
		Code() int64
	}

	if code, ok := err.(coder); ok {
		errno = code.Code()
	}

	if errno >= minInternalErr {
		errno = exterr.E_DEFAULT_ERROR
	}

	return errno
}

func GenOuterErrmsg(err error) string {
	if err == nil {
		return exterr.Msg[exterr.E_ErrOk]
	}

	errmsg, _ := exterr.Msg[GenOuterErrno(err)]

	errno := GenOuterErrno(err)
	if errno < minInternalErr && errno != exterr.E_DEFAULT_ERROR {
		errmsg = err.Error()
	}

	return errmsg
}

func GetHttpQueryParam(ctx context.Context, key string) string {
	t, _ := trace.GetCtxTrace(ctx)
	if t == nil {
		return ""
	}

	values, err := url.ParseQuery(t.Params)
	if err != nil {
		return ""
	}

	return values.Get(key)
}